package com.cltech.frame.base;


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 数据库操作基类.
 *
 * @author zhangyinggang
 * @version 1.0.0.0
 * @param <T> 实体
 * @param <ID> 实体
 */
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
    /**
     * 原生查询列表.
     * @param clazz 返回POJO
     * @param sql sql
     * @param values 参数
     * @param <D> 返回POJO
     * @return 返回POJO
     */
    <D> List<D> listBySQL(Class<D> clazz, String sql, List<Object> values);
    /**
     * 原生查询列表.
     * @param sql sql
     * @param values 参数
     * @return 返回map
     */
    List<Map<String, Object>> listBySQL(String sql, List<Object> values);
    /**
     * 原生sql查询数量.
     * @param sql sql
     * @param values values
     * @return 数量
     */
    Long countBySQL(String sql, List<Object> values);

    /**
     *
     * @param entity
     */
    void detach(T entity);

    /**
     *
     */
    void clear();
}
